﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using BLL.IServiceImplementation;
using BLL.ServiceImplementation;
using BLL.DTO.Region;
using BLL.DTO.Ciudad;
using BLL.DTO.Comuna;
using BLL.DTO.Propiedad;
using Web.Helper;
using BLL.DTO.TipoPropiedad;
using BLL.DTO.HelperDTO.Propiedad;
using System.IO;
using BLL.Enums;
using BLL.DTO.Imagenes;

namespace Web.Controllers.PublicaTuPropiedadController
{
    public class PropiedadesController : BaseController
    {
        //CONSTRUCTOR
        private readonly IPropiedadSvc propiedadSvc;
        private readonly IRegionSvc regionSvc;
        private readonly ICiudadSvc ciudadSvc;
        private readonly IComunaSvc comunaSvc;
        private readonly ITipoPropiedadSvc tipoPropiedadSvc;

        private readonly int rutUsuario;
        private readonly int idTipoPersona;

        public PropiedadesController()
        {
            propiedadSvc = new PropiedadSvcImpl();
            regionSvc = new RegionSvImpl();
            ciudadSvc = new CiudadSvcImpl();
            comunaSvc = new ComunaSvcImpl();
            tipoPropiedadSvc = new TipoPropiedadSvcImpl();
            rutUsuario = 17782793;
            idTipoPersona = (int)eTipoPersona.PersonaNatural;
        }

        //
        // GET: /Propiedades/

        #region [Propiedad]

        public ActionResult MisPropiedades()
        {
            return View("MisPropiedades");
        }

        public PartialViewResult CreatePropiedad()
        {
            FillDropDownListRegion();
            FillDropDownListCiudad();
            FillDropDownListComuna();
            FillDropDownListTipoPropiedad();
            return PartialView("CreatePropiedad");
        }

        [HttpPost]
        public JsonResult CreatePropiedad_Submit(FormCollection frmCollection, bool? OficinaCocina)
        {
            GenericJsonResult jsonResult = new GenericJsonResult(ok: false, isModelValid: true);
            try
            {
                HttpPostedFileBase imagenPortada = Request.Files["NombreImagenPortada"];
                if (string.IsNullOrEmpty(imagenPortada.FileName))
                    throw new Exception("Ingrese imagen de portada");
                else
                {
                    ImageValidations(imagenPortada);
                }

                for (int i = 1; i < 5; i++)
                {
                    ImageValidations(Request.Files[i]);
                }

                PropiedadDTO propiedadDTO = new PropiedadDTO()
                {
                    IdTipoPropiedad = Convert.ToInt32(frmCollection["IdTipoPropiedad"]),
                    RutUsuario = rutUsuario,
                    TipoPersonaUsuario = idTipoPersona,
                    Direccion = frmCollection["Direccion"],
                    NumeroPropiedad = Convert.ToInt32(frmCollection["NumeroPropiedad"]),
                    Terreno = Convert.ToInt32(frmCollection["Terreno"]),
                    FechaRegistro = DateTime.Now,
                    SuperficieConstruida = Convert.ToInt32(frmCollection["SuperficieConstruida"]),
                    IdRegion = Convert.ToInt32(frmCollection["IdRegion"]),
                    IdCiudad = Convert.ToInt32(frmCollection["IdCiudad"]),
                    IdComuna = Convert.ToInt32(frmCollection["IdComuna"])
                };

                int idTipoPropiedad = Convert.ToInt32(frmCollection["IdTipoPropiedad"]);
                switch (idTipoPropiedad)
                {
                    case (int)eTipoPropiedad.Casa:
                        CasaDTO casaDTO = new CasaDTO()
                        {
                            AnoConstruccion = Convert.ToInt32(frmCollection["CasaAnoConstruccion"]),
                            CantidadBanos = Convert.ToInt32(frmCollection["CasaCantidadBanos"]),
                            CantidadDormitorios = Convert.ToInt32(frmCollection["CasaCantidadDormitorios"]),
                            CantidadEstacionamiento = Convert.ToInt32(frmCollection["CasaCantidadEstacionamiento"]),
                            DescirpcionComedor = frmCollection["CasaDescripcionComedor"],
                            DescripcionLiving = frmCollection["CasaDescripcionLiving"],
                            Detalle = frmCollection["CasaDetalle"],
                            Distribucion = frmCollection["CasaDistribucion"],
                            Estilo = frmCollection["CasaEstiloCasa"],
                            Orientacion = frmCollection["CasaOrientacion"],
                            TipoConstruccion = frmCollection["CasaTipoConstruccion"]
                        };

                        propiedadSvc.CreatePropiedadCasa(propiedadDTO, casaDTO);
                        break;
                    case (int)eTipoPropiedad.Departamento:
                        DepartamentoDTO departamentoDTO = new DepartamentoDTO()
                        {
                            AnoConstruccion = Convert.ToInt32(frmCollection["DptoAnoConstruccion"]),
                            CantidadBanos = Convert.ToInt32(frmCollection["DptoCantidadBanos"]),
                            CantidadDormitorios = Convert.ToInt32(frmCollection["DptoCantidadDormitorios"]),
                            DescripcionComedor = frmCollection["DptoDescripcionComedor"],
                            DescripcionLiving = frmCollection["DptoDescripcionLiving"],
                            Detalle = frmCollection["DptoDetalle"],
                            Distribucion = frmCollection["DptoDistribucion"],
                            Orientacion = frmCollection["DptoOrientancion"],
                            TipoConstruccion = frmCollection["DptoTipoConstruccion"],
                            TipoDepartamento = frmCollection["DptoTipoDepartamento"]
                        };

                        propiedadSvc.CreatePropiedadDepartamento(propiedadDTO, departamentoDTO);
                        break;
                    case (int)eTipoPropiedad.Oficina:
                        OficinaDTO oficinaDTO = new OficinaDTO()
                        {
                            AnoConstruccion = Convert.ToInt32(frmCollection["OficinaAnoConstruccion"]),
                            CantidadBanos = Convert.ToInt32(frmCollection["OficinaCantidadBanos"]),
                            Cocina = OficinaCocina.GetValueOrDefault(),
                            OficinaTipoConstruccion = frmCollection["OficinaTipoConstruccion"],
                            Detalle = frmCollection["OficinaDetalle"]
                        };

                        propiedadSvc.CreatePropiedadOficina(propiedadDTO, oficinaDTO);
                        break;
                    case (int)eTipoPropiedad.Terreno:
                        TerrenoDTO terrenoDto = new TerrenoDTO()
                        {
                            TipoTerreno = frmCollection["TerrenoTipoTerreno"],
                            TipoTierra = frmCollection["TerrenoTipoTierra"],
                            Detalle = frmCollection["TerrenoDetalle"]
                        };

                        propiedadSvc.CreatePropiedadTerreno(propiedadDTO, terrenoDto);
                        break;
                    default:
                        throw new Exception("Tipo de propiedad no definido.");
                }

                jsonResult.Ok = true;
            }
            catch (Exception ex)
            {
                jsonResult.ErrorMessage = ex.Message;
                jsonResult.Ok = false;

                PartialViewResult result = CreatePropiedad();
                jsonResult.RenderedView = result.RenderToString(ControllerContext);
            }
            return Json(jsonResult);
        }

        public JsonResult GetCiudadByRegion(int idRegion)
        {
            GenericJsonResult jsonResult = new GenericJsonResult(ok: false, isModelValid: true);
            try
            {
                jsonResult.Data = ciudadSvc.GetAllByIdRegion(idRegion);
                jsonResult.Ok = true;
            }
            catch (Exception ex)
            {
                jsonResult.ErrorMessage = ex.Message;
            }
            return Json(jsonResult);
        }

        public JsonResult GetComunaByCiudad(int idCiudad)
        {
            GenericJsonResult jsonResult = new GenericJsonResult(ok: false, isModelValid: true);
            try
            {
                jsonResult.Data = comunaSvc.GetAllByIdCity(idCiudad);
                jsonResult.Ok = true;
            }
            catch (Exception ex)
            {
                jsonResult.ErrorMessage = ex.Message;
            }

            return Json(jsonResult);
        }

        #endregion

        #region [PrivateMethods]

        private void FillDropDownListRegion()
        {
            List<RegionDTO> regionList = regionSvc.GetAll();
            ViewBag.RegionList = new SelectList(regionList, "pk_Region", "nombre_Region");
        }

        private void FillDropDownListCiudad()
        {
            List<CiudadDTO> ciudadList = new List<CiudadDTO>();
            ViewBag.CiudadList = new SelectList(ciudadList, "pk_Ciudad", "nombre_Ciudad");
        }

        private void FillDropDownListComuna()
        {
            List<ComunaDTO> comunaList = new List<ComunaDTO>();
            ViewBag.ComunaList = new SelectList(comunaList, "pk_Comuna", "nombre_Comuna");
        }

        private void FillDropDownListTipoPropiedad()
        {
            List<TipoPropiedadDTO> TipoPropiedadList = tipoPropiedadSvc.GetAll();
            ViewBag.TipoPropiedadList = new SelectList(TipoPropiedadList, "IdTipoPropiedad", "Nombre");
        }

        private void ImageValidations(HttpPostedFileBase file)
        {
            string imgExtension = string.Empty;
            if (!string.IsNullOrEmpty(file.FileName))
            {
                #region [ImageExtension]

                imgExtension = Path.GetExtension(file.FileName);
                if (imgExtension != ".jpg" && imgExtension != ".jpeg" && imgExtension != ".png")
                    throw new Exception(string.Format(Resources.Business.Propiedad.errorImageExtension, file.FileName));

                #endregion

                #region [ImageSize]

                double imgSize = file.ContentLength / 1024;
                imgSize = imgSize / 1024;
                imgSize = Math.Round(imgSize, 2);
                if (imgSize > 2.5)
                    throw new Exception(string.Format(Resources.Business.Propiedad.errorImageSize, file.FileName));

                #endregion
            }
        }
        #endregion
    }
}
